from typing import Dict, List

class FileClassifierConfig:
    """
    文件分类器配置类
    定义文件分类的规则和设置
    """
    
    # 文件扩展名到分类文件夹的映射
    EXTENSION_FOLDER_MAP: Dict[str, str] = {
        '.txt': 'text_files',      # 文本文件
        '.json': 'json_data',      # JSON数据文件
        '.csv': 'csv_data',        # CSV数据文件
        '.xlsx': 'excel_files',    # Excel文件
        '.log': 'log_files',       # 日志文件
        '.md': 'markdown_files',   # Markdown文件
        '.html': 'html_files',     # HTML文件
        '.xml': 'xml_files',       # XML文件
        '.pdf': 'pdf_files',       # PDF文件
        '.docx': 'word_files',     # Word文档
        '.jpg': 'image_files',     # 图片文件
        '.jpeg': 'image_files',    # 图片文件
        '.png': 'image_files',     # 图片文件
        '.gif': 'image_files',     # 图片文件
        '.mp4': 'video_files',     # 视频文件
        '.avi': 'video_files',     # 视频文件
        '.mp3': 'audio_files',     # 音频文件
        '.wav': 'audio_files',     # 音频文件
    }
    
    # 默认设置
    DEFAULT_DATA_PATH: str = "data"                    # 默认数据文件夹路径
    DEFAULT_UNKNOWN_FOLDER: str = "other_files"        # 未知类型文件的文件夹名
    CLASSIFIED_FOLDER_PREFIX: str = "classified_"      # 分类文件夹前缀
    
    # 需要忽略的文件列表
    IGNORED_FILES: List[str] = [
        '.gitkeep',
        '.DS_Store',
        'Thumbs.db',
        'desktop.ini'
    ]
    
    # 需要忽略的文件夹列表
    IGNORED_FOLDERS: List[str] = [
        '.git',
        '__pycache__',
        'node_modules',
        '.vscode'
    ]
    
    @classmethod
    def getFolderNameByExtension(cls, fileExtension: str) -> str:
        """
        根据文件扩展名获取分类文件夹名称
        
        Args:
            fileExtension (str): 文件扩展名
            
        Returns:
            str: 分类文件夹名称
        """
        folderName = cls.EXTENSION_FOLDER_MAP.get(fileExtension.lower(), cls.DEFAULT_UNKNOWN_FOLDER)  # 获取文件夹名称
        return f"{cls.CLASSIFIED_FOLDER_PREFIX}{folderName}"
    
    @classmethod
    def isIgnoredFile(cls, fileName: str) -> bool:
        """
        判断文件是否应该被忽略
        
        Args:
            fileName (str): 文件名
            
        Returns:
            bool: 是否应该忽略
        """
        return fileName in cls.IGNORED_FILES
    
    @classmethod
    def isIgnoredFolder(cls, folderName: str) -> bool:
        """
        判断文件夹是否应该被忽略
        
        Args:
            folderName (str): 文件夹名
            
        Returns:
            bool: 是否应该忽略
        """
        return folderName in cls.IGNORED_FOLDERS 